package com.kira.scaffoldmvc.Dubbo.Compression.Strategy;

import lombok.extern.slf4j.Slf4j;
import org.xerial.snappy.Snappy;

import java.nio.charset.StandardCharsets;

/**
 * Snappy压缩算法实现类
 * 基于xerial/snappy-java库，特点是压缩/解压速度极快，适合对性能要求高的场景
 */
@Slf4j
public class SnappyCompression implements CompressionStrategy {

    /**
     * 压缩字符串为字节数组
     * @param data 待压缩的字符串（支持中文、特殊字符，避免乱码）
     * @return 压缩后的字节数组；若输入为空，返回空数组
     */
    @Override
    public byte[] compress(String data) {
        // 空值校验：避免空指针和无效压缩
        if (data == null || data.isEmpty()) {
            log.warn("Snappy待压缩字符串为空，直接返回空数组");
            return new byte[0];
        }

        try {
            // 1. 字符串转UTF-8字节数组（统一编码，防止中文乱码）
            byte[] inputBytes = data.getBytes(StandardCharsets.UTF_8);
            // 2. Snappy核心压缩（原生方法，性能极快）
            return Snappy.compress(inputBytes);
        } catch (Exception e) {
            // 捕获其他异常（如编码异常）
            log.error("Snappy压缩时发生未知异常", e);
            throw new RuntimeException("Unexpected error in Snappy compression", e);
        }
    }

    /**
     * 解压字节数组为字符串
     * @param data 待解压的Snappy压缩字节数组
     * @return 解压后的原始字符串；若输入为空，返回空字符串
     */
    @Override
    public String uncompress(byte[] data) {
        // 空值校验：避免空指针和无效解压
        if (data == null || data.length == 0) {
            log.warn("Snappy待解压字节数组为空，直接返回空字符串");
            return "";
        }

        try {
            // 1. Snappy核心解压（自动识别压缩格式）
            byte[] outputBytes = Snappy.uncompress(data);
            // 2. 字节数组转UTF-8字符串（与压缩编码一致，避免乱码）
            return new String(outputBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            log.error("Snappy解压时发生未知异常", e);
            throw new RuntimeException("Unexpected error in Snappy decompression", e);
        }
    }
}